Making Dataframes
county_color <- c("#58b5e1","#1c5b5a","#46ebdc","#1f4196","#e28de2","#818bd7","#e4ccf1","#82185f","#f849b6","#000000","#5e34bc","#b7d165","#30d52e","#ff5357")
counties <- c('Anson', 'Cabarrus', 'Catawba', 'Chester', 'Cleveland', 'Gaston', 'Iredell', 'Lancaster', 'Lincoln', 'Mecklenburg', 'Rowan', 'Stanly', 'Union', 'York')
county_color <- set_names(county_color, counties)
attainment_lvl <- c('Highest Degree: Less than a High School Diploma', 'Highest Degree: High School Diploma', 'Highest Degree: Some College, No Degree', "Highest Degree: Associate's Degree", "Highest Degree: Bachelor's Degree", "Highest Degree: Graduate or Professional Degree")
foreign_detail <- c('Foreign-Born: Africa', 'Foreign-Born: Asia', 'Foreign-Born: Europe', 'Foreign-Born: Latin America', 'Place of Birth Total')
countypop <- rbind(read_csv("cc-est2019-agesex-37.csv", show_col_types = F),
read_csv("cc-est2019-agesex-45.csv", show_col_types = F)) %>%
select(-SUMLEV, -STATE, -COUNTY) %>%
mutate(CTYNAME = gsub(' County', '', CTYNAME),
YEAR = as.integer(YEAR + 2007)) %>%
filter(CTYNAME %in% counties, YEAR >= 2010,
!(STNAME == 'South Carolina' & CTYNAME == 'Union')) %>%
distinct()
# Year 3 is 2010, Year 12 is 2019
# Making Charlotte Region
cr <- countypop[1:10,] %>%
mutate(CTYNAME = 'Charlotte Region')
for(i in 4:length(colnames(countypop))) {
for(j in 1:10){
cr[j,i] <- sum((countypop %>% filter(YEAR == j+2009))[i])
}
}
# Making Age & Gender data frame
pop_age_gender <- rbind(countypop, cr)
countypop <- cr %>% transmute(YEAR = YEAR, CHARLOTTEPOP = POPESTIMATE) %>% right_join(countypop, by = 'YEAR') %>% mutate(PROPORTION = POPESTIMATE / CHARLOTTEPOP) %>%
group_by(CTYNAME) %>%
mutate(CHANGE = round(ifelse(YEAR == 2010, 0, POPESTIMATE/lag(POPESTIMATE, default = first(YEAR)) - 1),4)) %>%
ungroup()
pop_age_gender <- pop_age_gender %>%
select(-contains('_TOT'), -POPEST_FEM, -POPEST_MALE, -AGE16PLUS_MALE, -AGE16PLUS_FEM, -AGE18PLUS_FEM, -AGE18PLUS_MALE, -UNDER5_FEM, -UNDER5_MALE, -AGE1544_FEM, -AGE1544_MALE, -MEDIAN_AGE_FEM, -MEDIAN_AGE_MALE, -AGE65PLUS_FEM,-AGE65PLUS_MALE, -AGE513_FEM, -AGE513_MALE, -AGE4564_FEM, -AGE4564_MALE, -AGE2544_FEM, -AGE2544_MALE, -AGE1824_FEM, -AGE1824_MALE, -AGE1417_FEM, -AGE1417_MALE) %>%
rename(AGE004_FEM = AGE04_FEM, AGE004_MALE = AGE04_MALE, AGE0509_MALE = AGE59_MALE, AGE0509_FEM = AGE59_FEM)
pop_age_gender <- pop_age_gender %>%
pivot_longer(cols = colnames(pop_age_gender[,5:40]), names_to = 'DEMO', values_to = 'POP') %>%
mutate(PERCENTAGE = POP/POPESTIMATE)
pop_age_gender <- pop_age_gender %>%
mutate(GENDER = as.factor(ifelse(grepl('MALE', pop_age_gender$DEMO),'MALE','FEMALE')),
DEMO = gsub('_FEM','', DEMO),
DEMO = gsub('_MALE','', DEMO),
DEMO = case_when(DEMO == 'AGE004' ~ '0-04',
DEMO == 'AGE0509' ~ '05-09',
DEMO == 'AGE1014' ~ '10-14',
DEMO == 'AGE1519' ~ '15-19',
DEMO == 'AGE2024' ~ '20-24',
DEMO == 'AGE2529' ~ '25-29',
DEMO == 'AGE3034' ~ '30-34',
DEMO == 'AGE3539' ~ '35-39',
DEMO == 'AGE4044' ~ '40-44',
DEMO == 'AGE4549' ~ '45-49',
DEMO == 'AGE5054' ~ '50-54',
DEMO == 'AGE5559' ~ '55-59',
DEMO == 'AGE6064' ~ '60-64',
DEMO == 'AGE6569' ~ '65-69',
DEMO == 'AGE7074' ~ '70-74',
DEMO == 'AGE7579' ~ '75-79',
DEMO == 'AGE8084' ~ '80-84',
DEMO == 'AGE85PLUS' ~ '85 and Over'))
# Making ethnicity data frame
ethpop <- rbind(read_csv("cc-est2019-alldata-37.csv", show_col_types = F),
read_csv("cc-est2019-alldata-45.csv", show_col_types = F)) %>%
mutate(CTYNAME = gsub(' County', '', CTYNAME),
YEAR = as.integer(YEAR + 2007),
WHITE = NHWA_MALE + NHWA_FEMALE,
BLACK = NHBA_MALE + NHBA_FEMALE,
HISPANIC = HWA_MALE + HWA_FEMALE + HBA_MALE + HBA_FEMALE + HIA_MALE + HIA_FEMALE + HAA_MALE + HAA_FEMALE + HNA_MALE + HNA_FEMALE + HIA_MALE + HIA_FEMALE,
ASIAN = NHAA_MALE + NHAA_FEMALE,
ISLANDER = NHNA_MALE + NHNA_FEMALE,
NATIVE = NHIA_MALE + NHIA_FEMALE,
MULTIRACIAL = TOM_MALE + TOM_FEMALE - HTOM_MALE - HTOM_FEMALE
) %>%
filter(CTYNAME %in% counties, YEAR >= 3, AGEGRP == 0,
!(STNAME == 'South Carolina' & CTYNAME == 'Union')) %>%
select(STNAME, CTYNAME, YEAR, TOT_POP, WHITE, BLACK, HISPANIC, ASIAN, ISLANDER, NATIVE, MULTIRACIAL) %>%
distinct()
ethpop <- ethpop %>%
pivot_longer(cols = colnames(ethpop[,5:11]), names_to = 'ETHNICITY', values_to = 'POP')
# Making place of birth data frame
birthplace <- read.csv('Values.csv') %>%
mutate(County = gsub(' County, North Carolina', '', County),
County = gsub(' County, South Carolina', '', County)) %>%
filter(Indicator == 'Place of Birth',
County %in% counties,
!(Measure %in% foreign_detail)) %>%
distinct()
birthplace <- birthplace %>% inner_join((birthplace %>% group_by(County, Year) %>% summarise(Total = sum(Numerator_value))), by = c('County', 'Year'))
`summarise()` has grouped output by 'County'. You can override using the `.groups` argument.
# Making the unemployment data frame
unemployment <- rbind(read_excel('ur_anson.xlsx', trim_ws = T) %>% mutate(County = 'Anson', Period = gsub('M', '', Period)),
read_excel('ur_cabarrus.xlsx', trim_ws = T) %>% mutate(County = 'Cabarrus', Period = gsub('M', '', Period)),
read_excel('ur_catawba.xlsx', trim_ws = T) %>% mutate(County = 'Catawba', Period = gsub('M', '', Period)),
read_excel('ur_chester.xlsx', trim_ws=T, skip=11)[1:266,] %>% rename(Value = 'Observation Value') %>% mutate(County = 'Chester', Period = gsub('M','',Period)) %>% select(-Label),
read_excel('ur_cleveland.xlsx', trim_ws = T) %>% mutate(County = 'Cleveland', Period = gsub('M', '', Period)),
read_excel('ur_gaston.xlsx', trim_ws = T) %>% mutate(County = 'Gaston', Period = gsub('M', '', Period)),
read_excel('ur_iredell.xlsx', trim_ws = T) %>% mutate(County = 'Iredell', Period = gsub('M', '', Period)),
read_excel('ur_lancaster.xlsx', trim_ws = T) %>% mutate(County = 'Lancaster', Period = gsub('M', '', Period)),
read_excel('ur_lincoln.xlsx', trim_ws = T) %>% mutate(County = 'Lincoln', Period = gsub('M', '', Period)),
read_excel('ur_mecklenburg.xlsx', trim_ws = T) %>% mutate(County = 'Mecklenburg', Period = gsub('M', '', Period)),
read_excel('ur_rowan.xlsx', trim_ws = T) %>% mutate(County = 'Rowan', Period = gsub('M', '', Period)),
read_excel('ur_stanly.xlsx', trim_ws=T, skip=11)[1:266,] %>% rename(Value = 'Observation Value') %>% mutate(County = 'Stanly', Period = gsub('M','',Period)) %>% select(-Label),
read_excel('ur_union.xlsx', trim_ws = T) %>% mutate(County = 'Union', Period = gsub('M', '', Period)),
read_excel('ur_york.xlsx', trim_ws = T) %>% mutate(County = 'York', Period = gsub('M', '', Period))) %>%
mutate(Year = as.integer(Year),
Period = as.integer(Period),
Date = as.Date(paste(Year,'-',Period, '-01', sep = '')),
Value = Value/100) %>%
rename(Month = Period,
Unemployment = Value)
# Make income data frame
income <- read.csv('Values.csv') %>%
mutate(County = gsub(' County, North Carolina', '', County),
County = gsub(' County, South Carolina', '', County)) %>%
filter(Indicator == 'Income & Earnings',
County %in% counties,
Measure != 'Household Income: Total') %>%
distinct()
income <- income %>% inner_join((income %>% group_by(County, Year) %>% summarise(Total = sum(Numerator_value))), by = c('County', 'Year'))
`summarise()` has grouped output by 'County'. You can override using the `.groups` argument.
# Make education attainment data frame
education <- read.csv('Values.csv') %>%
mutate(County = gsub(' County, North Carolina', '', County),
County = gsub(' County, South Carolina', '', County)) %>%
filter(Indicator == 'Educational Attainment',
County %in% counties,
Measure %in% attainment_lvl) %>%
distinct()
education <- education %>% inner_join((education %>% group_by(County, Year) %>% summarise(Total = sum(Numerator_value))), by = c('County', 'Year')) %>%
mutate(
Order = as.factor(case_when(
Measure == 'Highest Degree: Less than a High School Diploma' ~ 1,
Measure == 'Highest Degree: High School Diploma' ~ 2,
Measure == 'Highest Degree: Some College, No Degree' ~ 3,
Measure == "Highest Degree: Associate's Degree" ~ 4,
Measure == "Highest Degree: Bachelor's Degree" ~ 5,
Measure == "Highest Degree: Graduate or Professional Degree" ~ 6)),
Measure = gsub("Highest Degree: ","",Measure))
`summarise()` has grouped output by 'County'. You can override using the `.groups` argument.
# Make health care coverage data frame
coverage <- read.csv('Values.csv') %>%
mutate(County = gsub(' County, North Carolina', '', County),
County = gsub(' County, South Carolina', '', County)) %>%
filter(Indicator == 'Health Care Coverage',
County %in% counties)
# Make drug related deaths data frame
drug <-read_excel('drug_mortality.xlsx') %>%
separate(County, into=c("County",'State'), sep=', ', remove=FALSE) %>%
mutate(County = gsub(' County', '', County)) %>%
filter(County %in% counties, Year >= 2010,
State=='NC' | State=='SC',
!(State == 'SC' & County == 'Union')) %>%
distinct()
# Make housing age data frame
housing <- read.csv('Values.csv') %>%
mutate(County = gsub(' County, North Carolina', '', County),
County = gsub(' County, South Carolina', '', County),
diff = Year-Numerator_value) %>%
filter(Indicator == 'Housing Stock',
County %in% counties)
# Make poverty figures data frame
poverty <- read.csv('Values.csv') %>%
mutate(County = gsub(' County, North Carolina', '', County),
County = gsub(' County, South Carolina', '', County)) %>%
filter(Measure == 'Individuals in Poverty',
Theme == 'Social Well-Being',
County %in% counties)
# Make transportation means data frame
transportation <- read.csv('Values.csv') %>%
mutate(County = gsub(' County, North Carolina', '', County),
County = gsub(' County, South Carolina', '', County)) %>%
filter(Theme == 'Transportation',
Measure != 'Commuting Means Total',
County %in% counties)
LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQojIExvYWQgUGFja2FnZXMNCmBgYHtyfQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGdndGhlbWVzKQ0KbGlicmFyeShzY2FsZXMpDQpsaWJyYXJ5KHJlYWR4bCkNCmxpYnJhcnkocGxvdGx5KQ0KYGBgDQoNCg0KIyBNYWtpbmcgRGF0YWZyYW1lcw0KYGBge3J9DQpjb3VudHlfY29sb3IgPC0gYygiIzU4YjVlMSIsIiMxYzViNWEiLCIjNDZlYmRjIiwiIzFmNDE5NiIsIiNlMjhkZTIiLCIjODE4YmQ3IiwiI2U0Y2NmMSIsIiM4MjE4NWYiLCIjZjg0OWI2IiwiIzAwMDAwMCIsIiM1ZTM0YmMiLCIjYjdkMTY1IiwiIzMwZDUyZSIsIiNmZjUzNTciKQ0KY291bnRpZXMgPC0gYygnQW5zb24nLCAnQ2FiYXJydXMnLCAnQ2F0YXdiYScsICdDaGVzdGVyJywgJ0NsZXZlbGFuZCcsICdHYXN0b24nLCAnSXJlZGVsbCcsICdMYW5jYXN0ZXInLCAnTGluY29sbicsICdNZWNrbGVuYnVyZycsICdSb3dhbicsICdTdGFubHknLCAnVW5pb24nLCAnWW9yaycpDQpjb3VudHlfY29sb3IgPC0gc2V0X25hbWVzKGNvdW50eV9jb2xvciwgY291bnRpZXMpDQphdHRhaW5tZW50X2x2bCA8LSBjKCdIaWdoZXN0IERlZ3JlZTogTGVzcyB0aGFuIGEgSGlnaCBTY2hvb2wgRGlwbG9tYScsICdIaWdoZXN0IERlZ3JlZTogSGlnaCBTY2hvb2wgRGlwbG9tYScsICdIaWdoZXN0IERlZ3JlZTogU29tZSBDb2xsZWdlLCBObyBEZWdyZWUnLCAiSGlnaGVzdCBEZWdyZWU6IEFzc29jaWF0ZSdzIERlZ3JlZSIsICJIaWdoZXN0IERlZ3JlZTogQmFjaGVsb3IncyBEZWdyZWUiLCAiSGlnaGVzdCBEZWdyZWU6IEdyYWR1YXRlIG9yIFByb2Zlc3Npb25hbCBEZWdyZWUiKQ0KZm9yZWlnbl9kZXRhaWwgPC0gYygnRm9yZWlnbi1Cb3JuOiBBZnJpY2EnLCAnRm9yZWlnbi1Cb3JuOiBBc2lhJywgJ0ZvcmVpZ24tQm9ybjogRXVyb3BlJywgJ0ZvcmVpZ24tQm9ybjogTGF0aW4gQW1lcmljYScsICdQbGFjZSBvZiBCaXJ0aCBUb3RhbCcpDQoNCmNvdW50eXBvcCA8LSByYmluZChyZWFkX2NzdigiY2MtZXN0MjAxOS1hZ2VzZXgtMzcuY3N2Iiwgc2hvd19jb2xfdHlwZXMgPSBGKSwNCiAgICAgICAgICAgICAgICAgICByZWFkX2NzdigiY2MtZXN0MjAxOS1hZ2VzZXgtNDUuY3N2Iiwgc2hvd19jb2xfdHlwZXMgPSBGKSkgJT4lDQogIHNlbGVjdCgtU1VNTEVWLCAtU1RBVEUsIC1DT1VOVFkpICU+JQ0KICBtdXRhdGUoQ1RZTkFNRSA9IGdzdWIoJyBDb3VudHknLCAnJywgQ1RZTkFNRSksDQogICAgICAgICBZRUFSID0gYXMuaW50ZWdlcihZRUFSICsgMjAwNykpICU+JQ0KICBmaWx0ZXIoQ1RZTkFNRSAlaW4lIGNvdW50aWVzLCBZRUFSID49IDIwMTAsDQogICAgICAgICAhKFNUTkFNRSA9PSAnU291dGggQ2Fyb2xpbmEnICYgQ1RZTkFNRSA9PSAnVW5pb24nKSkgJT4lDQogIGRpc3RpbmN0KCkNCiMgWWVhciAzIGlzIDIwMTAsIFllYXIgMTIgaXMgMjAxOQ0KDQojIE1ha2luZyBDaGFybG90dGUgUmVnaW9uDQpjciA8LSBjb3VudHlwb3BbMToxMCxdICU+JQ0KICBtdXRhdGUoQ1RZTkFNRSA9ICdDaGFybG90dGUgUmVnaW9uJykNCmZvcihpIGluIDQ6bGVuZ3RoKGNvbG5hbWVzKGNvdW50eXBvcCkpKSB7DQogIGZvcihqIGluIDE6MTApew0KICAgIGNyW2osaV0gPC0gc3VtKChjb3VudHlwb3AgJT4lIGZpbHRlcihZRUFSID09IGorMjAwOSkpW2ldKQ0KICB9DQp9DQoNCiMgTWFraW5nIEFnZSAmIEdlbmRlciBkYXRhIGZyYW1lDQpwb3BfYWdlX2dlbmRlciA8LSByYmluZChjb3VudHlwb3AsIGNyKQ0KY291bnR5cG9wIDwtIGNyICU+JSB0cmFuc211dGUoWUVBUiA9IFlFQVIsIENIQVJMT1RURVBPUCA9IFBPUEVTVElNQVRFKSAlPiUgcmlnaHRfam9pbihjb3VudHlwb3AsIGJ5ID0gJ1lFQVInKSAlPiUgbXV0YXRlKFBST1BPUlRJT04gPSBQT1BFU1RJTUFURSAvIENIQVJMT1RURVBPUCkgJT4lDQogIGdyb3VwX2J5KENUWU5BTUUpICU+JQ0KICBtdXRhdGUoQ0hBTkdFID0gcm91bmQoaWZlbHNlKFlFQVIgPT0gMjAxMCwgMCwgUE9QRVNUSU1BVEUvbGFnKFBPUEVTVElNQVRFLCBkZWZhdWx0ID0gZmlyc3QoWUVBUikpIC0gMSksNCkpICU+JQ0KICB1bmdyb3VwKCkNCg0KcG9wX2FnZV9nZW5kZXIgPC0gcG9wX2FnZV9nZW5kZXIgJT4lDQogIHNlbGVjdCgtY29udGFpbnMoJ19UT1QnKSwgLVBPUEVTVF9GRU0sIC1QT1BFU1RfTUFMRSwgLUFHRTE2UExVU19NQUxFLCAtQUdFMTZQTFVTX0ZFTSwgLUFHRTE4UExVU19GRU0sIC1BR0UxOFBMVVNfTUFMRSwgLVVOREVSNV9GRU0sIC1VTkRFUjVfTUFMRSwgLUFHRTE1NDRfRkVNLCAtQUdFMTU0NF9NQUxFLCAtTUVESUFOX0FHRV9GRU0sIC1NRURJQU5fQUdFX01BTEUsIC1BR0U2NVBMVVNfRkVNLC1BR0U2NVBMVVNfTUFMRSwgLUFHRTUxM19GRU0sIC1BR0U1MTNfTUFMRSwgLUFHRTQ1NjRfRkVNLCAtQUdFNDU2NF9NQUxFLCAtQUdFMjU0NF9GRU0sIC1BR0UyNTQ0X01BTEUsIC1BR0UxODI0X0ZFTSwgLUFHRTE4MjRfTUFMRSwgLUFHRTE0MTdfRkVNLCAtQUdFMTQxN19NQUxFKSAlPiUNCiAgcmVuYW1lKEFHRTAwNF9GRU0gPSBBR0UwNF9GRU0sIEFHRTAwNF9NQUxFID0gQUdFMDRfTUFMRSwgQUdFMDUwOV9NQUxFID0gQUdFNTlfTUFMRSwgQUdFMDUwOV9GRU0gPSBBR0U1OV9GRU0pDQpwb3BfYWdlX2dlbmRlciA8LSBwb3BfYWdlX2dlbmRlciAlPiUNCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjb2xuYW1lcyhwb3BfYWdlX2dlbmRlclssNTo0MF0pLCBuYW1lc190byA9ICdERU1PJywgdmFsdWVzX3RvID0gJ1BPUCcpICU+JQ0KICBtdXRhdGUoUEVSQ0VOVEFHRSA9IFBPUC9QT1BFU1RJTUFURSkNCnBvcF9hZ2VfZ2VuZGVyIDwtIHBvcF9hZ2VfZ2VuZGVyICU+JQ0KICBtdXRhdGUoR0VOREVSID0gYXMuZmFjdG9yKGlmZWxzZShncmVwbCgnTUFMRScsIHBvcF9hZ2VfZ2VuZGVyJERFTU8pLCdNQUxFJywnRkVNQUxFJykpLA0KICAgICAgICAgREVNTyA9IGdzdWIoJ19GRU0nLCcnLCBERU1PKSwNCiAgICAgICAgIERFTU8gPSBnc3ViKCdfTUFMRScsJycsIERFTU8pLA0KICAgICAgICAgREVNTyA9IGNhc2Vfd2hlbihERU1PID09ICdBR0UwMDQnIH4gJzAtMDQnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBERU1PID09ICdBR0UwNTA5JyB+ICcwNS0wOScsDQogICAgICAgICAgICAgICAgICAgICAgICAgIERFTU8gPT0gJ0FHRTEwMTQnIH4gJzEwLTE0JywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgREVNTyA9PSAnQUdFMTUxOScgfiAnMTUtMTknLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBERU1PID09ICdBR0UyMDI0JyB+ICcyMC0yNCcsDQogICAgICAgICAgICAgICAgICAgICAgICAgIERFTU8gPT0gJ0FHRTI1MjknIH4gJzI1LTI5JywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgREVNTyA9PSAnQUdFMzAzNCcgfiAnMzAtMzQnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBERU1PID09ICdBR0UzNTM5JyB+ICczNS0zOScsDQogICAgICAgICAgICAgICAgICAgICAgICAgIERFTU8gPT0gJ0FHRTQwNDQnIH4gJzQwLTQ0JywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgREVNTyA9PSAnQUdFNDU0OScgfiAnNDUtNDknLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBERU1PID09ICdBR0U1MDU0JyB+ICc1MC01NCcsDQogICAgICAgICAgICAgICAgICAgICAgICAgIERFTU8gPT0gJ0FHRTU1NTknIH4gJzU1LTU5JywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgREVNTyA9PSAnQUdFNjA2NCcgfiAnNjAtNjQnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBERU1PID09ICdBR0U2NTY5JyB+ICc2NS02OScsDQogICAgICAgICAgICAgICAgICAgICAgICAgIERFTU8gPT0gJ0FHRTcwNzQnIH4gJzcwLTc0JywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgREVNTyA9PSAnQUdFNzU3OScgfiAnNzUtNzknLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBERU1PID09ICdBR0U4MDg0JyB+ICc4MC04NCcsDQogICAgICAgICAgICAgICAgICAgICAgICAgIERFTU8gPT0gJ0FHRTg1UExVUycgfiAnODUgYW5kIE92ZXInKSkNCg0KIyBNYWtpbmcgZXRobmljaXR5IGRhdGEgZnJhbWUNCmV0aHBvcCA8LSByYmluZChyZWFkX2NzdigiY2MtZXN0MjAxOS1hbGxkYXRhLTM3LmNzdiIsIHNob3dfY29sX3R5cGVzID0gRiksDQogICAgICAgICAgICAgICAgICAgcmVhZF9jc3YoImNjLWVzdDIwMTktYWxsZGF0YS00NS5jc3YiLCBzaG93X2NvbF90eXBlcyA9IEYpKSAlPiUNCiAgbXV0YXRlKENUWU5BTUUgPSBnc3ViKCcgQ291bnR5JywgJycsIENUWU5BTUUpLA0KICAgICAgICAgWUVBUiA9IGFzLmludGVnZXIoWUVBUiArIDIwMDcpLA0KICAgICAgICAgV0hJVEUgPSBOSFdBX01BTEUgKyBOSFdBX0ZFTUFMRSwNCiAgICAgICAgIEJMQUNLID0gTkhCQV9NQUxFICsgTkhCQV9GRU1BTEUsDQogICAgICAgICBISVNQQU5JQyA9IEhXQV9NQUxFICsgSFdBX0ZFTUFMRSArIEhCQV9NQUxFICsgSEJBX0ZFTUFMRSArIEhJQV9NQUxFICsgSElBX0ZFTUFMRSArIEhBQV9NQUxFICsgSEFBX0ZFTUFMRSArIEhOQV9NQUxFICsgSE5BX0ZFTUFMRSArIEhJQV9NQUxFICsgSElBX0ZFTUFMRSwNCiAgICAgICAgIEFTSUFOID0gTkhBQV9NQUxFICsgTkhBQV9GRU1BTEUsDQogICAgICAgICBJU0xBTkRFUiA9IE5ITkFfTUFMRSArIE5ITkFfRkVNQUxFLA0KICAgICAgICAgTkFUSVZFID0gTkhJQV9NQUxFICsgTkhJQV9GRU1BTEUsDQogICAgICAgICBNVUxUSVJBQ0lBTCA9IFRPTV9NQUxFICsgVE9NX0ZFTUFMRSAtIEhUT01fTUFMRSAtIEhUT01fRkVNQUxFDQogICAgICAgICApICU+JQ0KICBmaWx0ZXIoQ1RZTkFNRSAlaW4lIGNvdW50aWVzLCBZRUFSID49IDMsIEFHRUdSUCA9PSAwLA0KICAgICAgICAgIShTVE5BTUUgPT0gJ1NvdXRoIENhcm9saW5hJyAmIENUWU5BTUUgPT0gJ1VuaW9uJykpICU+JQ0KICBzZWxlY3QoU1ROQU1FLCBDVFlOQU1FLCBZRUFSLCBUT1RfUE9QLCBXSElURSwgQkxBQ0ssIEhJU1BBTklDLCBBU0lBTiwgSVNMQU5ERVIsIE5BVElWRSwgTVVMVElSQUNJQUwpICU+JQ0KICBkaXN0aW5jdCgpDQpldGhwb3AgPC0gZXRocG9wICU+JQ0KICBwaXZvdF9sb25nZXIoY29scyA9IGNvbG5hbWVzKGV0aHBvcFssNToxMV0pLCBuYW1lc190byA9ICdFVEhOSUNJVFknLCB2YWx1ZXNfdG8gPSAnUE9QJykNCg0KIyBNYWtpbmcgcGxhY2Ugb2YgYmlydGggZGF0YSBmcmFtZQ0KYmlydGhwbGFjZSA8LSByZWFkLmNzdignVmFsdWVzLmNzdicpICU+JQ0KICBtdXRhdGUoQ291bnR5ID0gZ3N1YignIENvdW50eSwgTm9ydGggQ2Fyb2xpbmEnLCAnJywgQ291bnR5KSwNCiAgICAgICAgIENvdW50eSA9IGdzdWIoJyBDb3VudHksIFNvdXRoIENhcm9saW5hJywgJycsIENvdW50eSkpICU+JQ0KICBmaWx0ZXIoSW5kaWNhdG9yID09ICdQbGFjZSBvZiBCaXJ0aCcsDQogICAgICAgICBDb3VudHkgJWluJSBjb3VudGllcywNCiAgICAgICAgICEoTWVhc3VyZSAlaW4lIGZvcmVpZ25fZGV0YWlsKSkgJT4lDQogIGRpc3RpbmN0KCkNCmJpcnRocGxhY2UgPC0gYmlydGhwbGFjZSAlPiUgaW5uZXJfam9pbigoYmlydGhwbGFjZSAlPiUgZ3JvdXBfYnkoQ291bnR5LCBZZWFyKSAlPiUgc3VtbWFyaXNlKFRvdGFsID0gc3VtKE51bWVyYXRvcl92YWx1ZSkpKSwgYnkgPSBjKCdDb3VudHknLCAnWWVhcicpKQ0KDQojIE1ha2luZyB0aGUgdW5lbXBsb3ltZW50IGRhdGEgZnJhbWUNCnVuZW1wbG95bWVudCA8LSByYmluZChyZWFkX2V4Y2VsKCd1cl9hbnNvbi54bHN4JywgdHJpbV93cyA9IFQpICU+JSBtdXRhdGUoQ291bnR5ID0gJ0Fuc29uJywgUGVyaW9kID0gZ3N1YignTScsICcnLCBQZXJpb2QpKSwNCiAgICAgICAgICAgICAgICAgICAgICByZWFkX2V4Y2VsKCd1cl9jYWJhcnJ1cy54bHN4JywgdHJpbV93cyA9IFQpICU+JSBtdXRhdGUoQ291bnR5ID0gJ0NhYmFycnVzJywgUGVyaW9kID0gZ3N1YignTScsICcnLCBQZXJpb2QpKSwNCiAgICAgICAgICAgICAgICAgICAgICByZWFkX2V4Y2VsKCd1cl9jYXRhd2JhLnhsc3gnLCB0cmltX3dzID0gVCkgJT4lIG11dGF0ZShDb3VudHkgPSAnQ2F0YXdiYScsIFBlcmlvZCA9IGdzdWIoJ00nLCAnJywgUGVyaW9kKSksDQogICAgICAgICAgICAgICAgICAgICAgcmVhZF9leGNlbCgndXJfY2hlc3Rlci54bHN4JywgdHJpbV93cz1ULCBza2lwPTExKVsxOjI2NixdICU+JSByZW5hbWUoVmFsdWUgPSAnT2JzZXJ2YXRpb24gVmFsdWUnKSAlPiUgbXV0YXRlKENvdW50eSA9ICdDaGVzdGVyJywgUGVyaW9kID0gZ3N1YignTScsJycsUGVyaW9kKSkgJT4lIHNlbGVjdCgtTGFiZWwpLA0KICAgICAgICAgICAgICAgICAgICAgIHJlYWRfZXhjZWwoJ3VyX2NsZXZlbGFuZC54bHN4JywgdHJpbV93cyA9IFQpICU+JSBtdXRhdGUoQ291bnR5ID0gJ0NsZXZlbGFuZCcsIFBlcmlvZCA9IGdzdWIoJ00nLCAnJywgUGVyaW9kKSksDQogICAgICAgICAgICAgICAgICAgICAgcmVhZF9leGNlbCgndXJfZ2FzdG9uLnhsc3gnLCB0cmltX3dzID0gVCkgJT4lIG11dGF0ZShDb3VudHkgPSAnR2FzdG9uJywgUGVyaW9kID0gZ3N1YignTScsICcnLCBQZXJpb2QpKSwNCiAgICAgICAgICAgICAgICAgICAgICByZWFkX2V4Y2VsKCd1cl9pcmVkZWxsLnhsc3gnLCB0cmltX3dzID0gVCkgJT4lIG11dGF0ZShDb3VudHkgPSAnSXJlZGVsbCcsIFBlcmlvZCA9IGdzdWIoJ00nLCAnJywgUGVyaW9kKSksDQogICAgICAgICAgICAgICAgICAgICAgcmVhZF9leGNlbCgndXJfbGFuY2FzdGVyLnhsc3gnLCB0cmltX3dzID0gVCkgJT4lIG11dGF0ZShDb3VudHkgPSAnTGFuY2FzdGVyJywgUGVyaW9kID0gZ3N1YignTScsICcnLCBQZXJpb2QpKSwNCiAgICAgICAgICAgICAgICAgICAgICByZWFkX2V4Y2VsKCd1cl9saW5jb2xuLnhsc3gnLCB0cmltX3dzID0gVCkgJT4lIG11dGF0ZShDb3VudHkgPSAnTGluY29sbicsIFBlcmlvZCA9IGdzdWIoJ00nLCAnJywgUGVyaW9kKSksDQogICAgICAgICAgICAgICAgICAgICAgcmVhZF9leGNlbCgndXJfbWVja2xlbmJ1cmcueGxzeCcsIHRyaW1fd3MgPSBUKSAlPiUgbXV0YXRlKENvdW50eSA9ICdNZWNrbGVuYnVyZycsIFBlcmlvZCA9IGdzdWIoJ00nLCAnJywgUGVyaW9kKSksDQogICAgICAgICAgICAgICAgICAgICAgcmVhZF9leGNlbCgndXJfcm93YW4ueGxzeCcsIHRyaW1fd3MgPSBUKSAlPiUgbXV0YXRlKENvdW50eSA9ICdSb3dhbicsIFBlcmlvZCA9IGdzdWIoJ00nLCAnJywgUGVyaW9kKSksDQogICAgICAgICAgICAgICAgICAgICAgcmVhZF9leGNlbCgndXJfc3Rhbmx5Lnhsc3gnLCB0cmltX3dzPVQsIHNraXA9MTEpWzE6MjY2LF0gJT4lIHJlbmFtZShWYWx1ZSA9ICdPYnNlcnZhdGlvbiBWYWx1ZScpICU+JSBtdXRhdGUoQ291bnR5ID0gJ1N0YW5seScsIFBlcmlvZCA9IGdzdWIoJ00nLCcnLFBlcmlvZCkpICU+JSBzZWxlY3QoLUxhYmVsKSwNCiAgICAgICAgICAgICAgICAgICAgICByZWFkX2V4Y2VsKCd1cl91bmlvbi54bHN4JywgdHJpbV93cyA9IFQpICU+JSBtdXRhdGUoQ291bnR5ID0gJ1VuaW9uJywgUGVyaW9kID0gZ3N1YignTScsICcnLCBQZXJpb2QpKSwNCiAgICAgICAgICAgICAgICAgICAgICByZWFkX2V4Y2VsKCd1cl95b3JrLnhsc3gnLCB0cmltX3dzID0gVCkgJT4lIG11dGF0ZShDb3VudHkgPSAnWW9yaycsIFBlcmlvZCA9IGdzdWIoJ00nLCAnJywgUGVyaW9kKSkpICU+JQ0KICBtdXRhdGUoWWVhciA9IGFzLmludGVnZXIoWWVhciksDQogICAgICAgICBQZXJpb2QgPSBhcy5pbnRlZ2VyKFBlcmlvZCksDQogICAgICAgICBEYXRlID0gYXMuRGF0ZShwYXN0ZShZZWFyLCctJyxQZXJpb2QsICctMDEnLCBzZXAgPSAnJykpLA0KICAgICAgICAgVmFsdWUgPSBWYWx1ZS8xMDApICU+JQ0KICByZW5hbWUoTW9udGggPSBQZXJpb2QsDQogICAgICAgICBVbmVtcGxveW1lbnQgPSBWYWx1ZSkNCg0KIyBNYWtlIGluY29tZSBkYXRhIGZyYW1lDQppbmNvbWUgPC0gcmVhZC5jc3YoJ1ZhbHVlcy5jc3YnKSAlPiUNCiAgbXV0YXRlKENvdW50eSA9IGdzdWIoJyBDb3VudHksIE5vcnRoIENhcm9saW5hJywgJycsIENvdW50eSksDQogICAgICAgICBDb3VudHkgPSBnc3ViKCcgQ291bnR5LCBTb3V0aCBDYXJvbGluYScsICcnLCBDb3VudHkpKSAlPiUNCiAgZmlsdGVyKEluZGljYXRvciA9PSAnSW5jb21lICYgRWFybmluZ3MnLA0KICAgICAgICAgQ291bnR5ICVpbiUgY291bnRpZXMsDQogICAgICAgICBNZWFzdXJlICE9ICdIb3VzZWhvbGQgSW5jb21lOiBUb3RhbCcpICU+JQ0KICBkaXN0aW5jdCgpDQppbmNvbWUgPC0gaW5jb21lICU+JSBpbm5lcl9qb2luKChpbmNvbWUgJT4lIGdyb3VwX2J5KENvdW50eSwgWWVhcikgJT4lIHN1bW1hcmlzZShUb3RhbCA9IHN1bShOdW1lcmF0b3JfdmFsdWUpKSksIGJ5ID0gYygnQ291bnR5JywgJ1llYXInKSkNCg0KIyBNYWtlIGVkdWNhdGlvbiBhdHRhaW5tZW50IGRhdGEgZnJhbWUNCmVkdWNhdGlvbiA8LSByZWFkLmNzdignVmFsdWVzLmNzdicpICU+JQ0KICBtdXRhdGUoQ291bnR5ID0gZ3N1YignIENvdW50eSwgTm9ydGggQ2Fyb2xpbmEnLCAnJywgQ291bnR5KSwNCiAgICAgICAgIENvdW50eSA9IGdzdWIoJyBDb3VudHksIFNvdXRoIENhcm9saW5hJywgJycsIENvdW50eSkpICU+JQ0KICBmaWx0ZXIoSW5kaWNhdG9yID09ICdFZHVjYXRpb25hbCBBdHRhaW5tZW50JywNCiAgICAgICAgIENvdW50eSAlaW4lIGNvdW50aWVzLA0KICAgICAgICAgTWVhc3VyZSAlaW4lIGF0dGFpbm1lbnRfbHZsKSAlPiUNCiAgZGlzdGluY3QoKQ0KZWR1Y2F0aW9uIDwtIGVkdWNhdGlvbiAlPiUgaW5uZXJfam9pbigoZWR1Y2F0aW9uICU+JSBncm91cF9ieShDb3VudHksIFllYXIpICU+JSBzdW1tYXJpc2UoVG90YWwgPSBzdW0oTnVtZXJhdG9yX3ZhbHVlKSkpLCBieSA9IGMoJ0NvdW50eScsICdZZWFyJykpICU+JQ0KICBtdXRhdGUoDQogICAgT3JkZXIgPSBhcy5mYWN0b3IoY2FzZV93aGVuKA0KICAgICAgTWVhc3VyZSA9PSAnSGlnaGVzdCBEZWdyZWU6IExlc3MgdGhhbiBhIEhpZ2ggU2Nob29sIERpcGxvbWEnIH4gMSwNCiAgICAgIE1lYXN1cmUgPT0gJ0hpZ2hlc3QgRGVncmVlOiBIaWdoIFNjaG9vbCBEaXBsb21hJyB+IDIsDQogICAgICBNZWFzdXJlID09ICdIaWdoZXN0IERlZ3JlZTogU29tZSBDb2xsZWdlLCBObyBEZWdyZWUnIH4gMywNCiAgICAgIE1lYXN1cmUgPT0gIkhpZ2hlc3QgRGVncmVlOiBBc3NvY2lhdGUncyBEZWdyZWUiIH4gNCwNCiAgICAgIE1lYXN1cmUgPT0gIkhpZ2hlc3QgRGVncmVlOiBCYWNoZWxvcidzIERlZ3JlZSIgfiA1LA0KICAgICAgTWVhc3VyZSA9PSAiSGlnaGVzdCBEZWdyZWU6IEdyYWR1YXRlIG9yIFByb2Zlc3Npb25hbCBEZWdyZWUiIH4gNikpLA0KICAgIE1lYXN1cmUgPSBnc3ViKCJIaWdoZXN0IERlZ3JlZTogIiwiIixNZWFzdXJlKSkNCiMgTWFrZSBoZWFsdGggY2FyZSBjb3ZlcmFnZSBkYXRhIGZyYW1lDQpjb3ZlcmFnZSA8LSByZWFkLmNzdignVmFsdWVzLmNzdicpICU+JQ0KICBtdXRhdGUoQ291bnR5ID0gZ3N1YignIENvdW50eSwgTm9ydGggQ2Fyb2xpbmEnLCAnJywgQ291bnR5KSwNCiAgICAgICAgIENvdW50eSA9IGdzdWIoJyBDb3VudHksIFNvdXRoIENhcm9saW5hJywgJycsIENvdW50eSkpICU+JQ0KICBmaWx0ZXIoSW5kaWNhdG9yID09ICdIZWFsdGggQ2FyZSBDb3ZlcmFnZScsDQogICAgICAgICBDb3VudHkgJWluJSBjb3VudGllcykNCiMgTWFrZSBkcnVnIHJlbGF0ZWQgZGVhdGhzIGRhdGEgZnJhbWUNCmRydWcgPC1yZWFkX2V4Y2VsKCdkcnVnX21vcnRhbGl0eS54bHN4JykgJT4lDQogIHNlcGFyYXRlKENvdW50eSwgaW50bz1jKCJDb3VudHkiLCdTdGF0ZScpLCBzZXA9JywgJywgcmVtb3ZlPUZBTFNFKSAlPiUNCiAgbXV0YXRlKENvdW50eSA9IGdzdWIoJyBDb3VudHknLCAnJywgQ291bnR5KSkgJT4lDQogIGZpbHRlcihDb3VudHkgJWluJSBjb3VudGllcywgWWVhciA+PSAyMDEwLA0KICAgICAgICAgU3RhdGU9PSdOQycgfCBTdGF0ZT09J1NDJywNCiAgICAgICAgICEoU3RhdGUgPT0gJ1NDJyAmIENvdW50eSA9PSAnVW5pb24nKSkgJT4lDQogIGRpc3RpbmN0KCkNCiMgTWFrZSBob3VzaW5nIGFnZSBkYXRhIGZyYW1lDQpob3VzaW5nIDwtIHJlYWQuY3N2KCdWYWx1ZXMuY3N2JykgJT4lDQogIG11dGF0ZShDb3VudHkgPSBnc3ViKCcgQ291bnR5LCBOb3J0aCBDYXJvbGluYScsICcnLCBDb3VudHkpLA0KICAgICAgICAgQ291bnR5ID0gZ3N1YignIENvdW50eSwgU291dGggQ2Fyb2xpbmEnLCAnJywgQ291bnR5KSwNCiAgICAgICAgIGRpZmYgPSBZZWFyLU51bWVyYXRvcl92YWx1ZSkgJT4lDQogIGZpbHRlcihJbmRpY2F0b3IgPT0gJ0hvdXNpbmcgU3RvY2snLA0KICAgICAgICAgQ291bnR5ICVpbiUgY291bnRpZXMpDQojIE1ha2UgcG92ZXJ0eSBmaWd1cmVzIGRhdGEgZnJhbWUNCnBvdmVydHkgPC0gcmVhZC5jc3YoJ1ZhbHVlcy5jc3YnKSAlPiUNCiAgbXV0YXRlKENvdW50eSA9IGdzdWIoJyBDb3VudHksIE5vcnRoIENhcm9saW5hJywgJycsIENvdW50eSksDQogICAgICAgICBDb3VudHkgPSBnc3ViKCcgQ291bnR5LCBTb3V0aCBDYXJvbGluYScsICcnLCBDb3VudHkpKSAlPiUNCiAgZmlsdGVyKE1lYXN1cmUgPT0gJ0luZGl2aWR1YWxzIGluIFBvdmVydHknLA0KICAgICAgICAgVGhlbWUgPT0gJ1NvY2lhbCBXZWxsLUJlaW5nJywNCiAgICAgICAgIENvdW50eSAlaW4lIGNvdW50aWVzKQ0KIyBNYWtlIHRyYW5zcG9ydGF0aW9uIG1lYW5zIGRhdGEgZnJhbWUNCnRyYW5zcG9ydGF0aW9uIDwtIHJlYWQuY3N2KCdWYWx1ZXMuY3N2JykgJT4lDQogIG11dGF0ZShDb3VudHkgPSBnc3ViKCcgQ291bnR5LCBOb3J0aCBDYXJvbGluYScsICcnLCBDb3VudHkpLA0KICAgICAgICAgQ291bnR5ID0gZ3N1YignIENvdW50eSwgU291dGggQ2Fyb2xpbmEnLCAnJywgQ291bnR5KSkgJT4lDQogIGZpbHRlcihUaGVtZSA9PSAnVHJhbnNwb3J0YXRpb24nLA0KICAgICAgICAgTWVhc3VyZSAhPSAnQ29tbXV0aW5nIE1lYW5zIFRvdGFsJywNCiAgICAgICAgIENvdW50eSAlaW4lIGNvdW50aWVzKQ0KYGBgDQoNCg0KIyBEZW1vZ3JhcGhpY3MNCiMjIFBvcHVsYXRpb24NCmBgYHtyfQ0KcGxvdF9seShjb3VudHlwb3AgJT4lIGZpbHRlcihZRUFSID09IDIwMTkpLCB4ID0gflBPUEVTVElNQVRFLCB5ID0gfkNUWU5BTUUsIHR5cGUgPSAnYmFyJywgY29sb3IgPSB+Q1RZTkFNRSwgY29sb3JzID0gY291bnR5X2NvbG9yLCBvcmllbnRhdGlvbiA9ICdoJykgJT4lDQogIGxheW91dCh0aXRsZT0gJzxiPiBFc3RpbWF0ZWQgQ291bnR5IFBvcHVsYXRpb24gYnkgWWVhciA8L2I+JywNCiAgICAgICAgIHhheGlzPSBsaXN0KHRpdGxlPSdQb3B1bGF0aW9uJywgdGlja2Zvcm1hdD0nLCcpLA0KICAgICAgICAgeWF4aXM9IGxpc3QodGl0bGU9JycpLA0KICAgICAgICAgbGVnZW5kPSBsaXN0KHRpdGxlPWxpc3QodGV4dD0nPGI+IENvdW50aWVzIDwvYj4nKSkpDQoNCnBsb3RfbHkoY291bnR5cG9wLCB4PX5ZRUFSLCB5PX5DSEFOR0UqMTAwLCBjb2xvcj1+Q1RZTkFNRSwgdHlwZT0nc2NhdHRlcicsIG1vZGU9J2xpbmVzJywgY29sb3JzPWNvdW50eV9jb2xvcikgJT4lDQogIGxheW91dCh0aXRsZT0gJzxiPiBDaGFuZ2UgaW4gQ291bnR5IFBvcHVsYXRpb24gZnJvbSBQcmV2aW91cyBZZWFyIDwvYj4nLA0KICAgICAgICAgeGF4aXM9IGxpc3QodGl0bGU9ICdZZWFyJyksDQogICAgICAgICB5YXhpcz0gbGlzdCh0aXRsZT0gJyUgQ2hhbmdlJywgdGlja3N1ZmZpeD0nJScsIHJhbmdlPWMoLTIsNC41KSksDQogICAgICAgICBsZWdlbmQ9IGxpc3QodGl0bGU9bGlzdCh0ZXh0PSc8Yj4gQ291bnRpZXMgPC9iPicpKSkNCmBgYA0KDQojIyBBZ2UgJiBHZW5kZXINCmBgYHtyLCBmaWcuaGVpZ2h0ID0gNiwgZmlnLndpZHRoPSAxMCwgd2FybmluZz1GQUxTRX0NCnBsb3RfbHkocG9wX2FnZV9nZW5kZXIgJT4lIGZpbHRlcihZRUFSID09IDIwMTcsIENUWU5BTUUgPT0gJ0NoYXJsb3R0ZSBSZWdpb24nKSwNCiAgICAgICAgeT1+REVNTywgeD1+UEVSQ0VOVEFHRSoxMDAsDQogICAgICAgIHR5cGU9J2JhcicsIGNvbG9yPX5HRU5ERVIpICU+JQ0KICBsYXlvdXQodGl0bGU9JzxiPiBDb3VudHkgUG9wdWxhdGlvbiBQZXJjZW50YWdlIGJ5IEFnZSBhbmQgR2VuZGVyIDwvYj4nLA0KICAgICAgICAgeWF4aXM9IGxpc3QodGl0bGU9JycpLA0KICAgICAgICAgeGF4aXM9IGxpc3QodGl0bGU9J1BvcHVsYXRpb24gJScsIHRpY2tzdWZmaXg9JyUnLCByYW5nZT1jKDAsNSkpLA0KICAgICAgICAgbGVnZW5kPSBsaXN0KHRpdGxlPWxpc3QodGV4dD0nPGI+IEdlbmRlciA8L2I+JykpKQ0KYGBgDQoNCiMjIFJhY2UgJiBFdGhuaWNpdHkNCmBgYHtyfQ0KcGxvdF9seShldGhwb3AgJT4lIGZpbHRlcihZRUFSID09IDIwMTkpLA0KICAgICAgICB5PX5DVFlOQU1FLCB4PX4oUE9QL1RPVF9QT1ApKjEwMCwgY29sb3I9fkVUSE5JQ0lUWSwNCiAgICAgICAgdHlwZT0nYmFyJykgJT4lDQogIGxheW91dChiYXJtb2RlID0gJ3N0YWNrJywNCiAgICAgICAgIHRpdGxlPSc8Yj4gQ291bnR5IFBvcHVsYXRpb24gUGVyY2VudGFnZSBieSBSYWNlIDwvYj4nLA0KICAgICAgICAgbGVnZW5kPWxpc3QodGl0bGU9bGlzdCh0ZXh0PSc8Yj4gUmFjZSA8L2I+JykpLA0KICAgICAgICAgeWF4aXM9IGxpc3QodGl0bGU9J0NvdW50eScpLA0KICAgICAgICAgeGF4aXM9IGxpc3QodGl0bGU9J1BvcHVsYXRpb24gJScsIHRpY2tzdWZmaXg9JyUnLCByYW5nZT1jKDAsMTAwKSkpDQpgYGANCg0KIyMgUGxhY2Ugb2YgQmlydGgNCmBgYHtyfQ0KcGxvdF9seShiaXJ0aHBsYWNlICU+JSBmaWx0ZXIoWWVhciA9PSAyMDE5KSwNCiAgICAgICAgeT1+Q291bnR5LCB4PX4oTnVtZXJhdG9yX3ZhbHVlL1RvdGFsKSoxMDAsIGNvbG9yPX5NZWFzdXJlLA0KICAgICAgICB0eXBlPSdiYXInKSAlPiUNCiAgbGF5b3V0KGJhcm1vZGUgPSAnc3RhY2snLA0KICAgICAgICAgdGl0bGU9JzxiPiBDb3VudHkgUG9wdWxhdGlvbiBQZXJjZW50YWdlIGJ5IFBsYWNlIG9mIEJpcnRoIDwvYj4nLA0KICAgICAgICAgbGVnZW5kPWxpc3QodGl0bGU9bGlzdCh0ZXh0PSc8Yj4gUGxhY2Ugb2YgQmlydGggPC9iPicpKSwNCiAgICAgICAgIHlheGlzPSBsaXN0KHRpdGxlPSdDb3VudHknKSwNCiAgICAgICAgIHhheGlzPSBsaXN0KHRpdGxlPSdQb3B1bGF0aW9uICUnLCB0aWNrc3VmZml4PSclJywgcmFuZ2U9YygwLDEwMCkpKQ0KYGBgDQoNCg0KDQojIEVjb25vbXkNCiMjIFVuZW1wbG95bWVudA0KYGBge3J9DQpwbG90X2x5KHVuZW1wbG95bWVudCwgeD1+RGF0ZSwgeT1+VW5lbXBsb3ltZW50LCBjb2xvcj1+Q291bnR5LCBjb2xvcnM9Y291bnR5X2NvbG9yLCB0eXBlPSdzY2F0dGVyJywgbW9kZT0nbGluZXMnKQ0KDQpwbG90X2x5KHVuZW1wbG95bWVudCAlPiUgZmlsdGVyKFllYXI9PTIwMTUsIE1vbnRoPT02KSwgeD1+VW5lbXBsb3ltZW50LCB5PX5Db3VudHksIGNvbG9yPX5Db3VudHksIGNvbG9ycz1jb3VudHlfY29sb3IsIHR5cGU9J2JhcicpDQpgYGANCg0KIyMjIyMjIyMjIyMjIyMjIyAgIDYvMjEgVXAgdG8gdGhpcyBwb2ludCBoYXMgYmVlbiBkb25lIGluIHRoZSBzaGlueSBhcHAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KDQojIyBJbmNvbWUNCmBgYHtyfQ0KIyMjIyBERnMgZnJvbSBWYWx1ZXMuY3N2IGFyZSBtaXNzaW5nIEFuc29uLCBDaGVzdGVyLCBhbmQgU3Rhbmx5IENvdW50aWVzDQpwbG90X2x5KGluY29tZSAlPiUgZmlsdGVyKFllYXIgPT0gMjAxNCksIHk9fkNvdW50eSwgeD1+KE51bWVyYXRvcl92YWx1ZS9Ub3RhbCksIGNvbG9yPX5NZWFzdXJlLCB0eXBlPSdiYXInKSAlPiUNCiAgbGF5b3V0KGJhcm1vZGU9J3N0YWNrJykNCmBgYA0KDQojIEVkdWNhdGlvbg0KIyMgRWR1Y2F0aW9uYWwgQXR0YWlubWVudA0KYGBge3J9DQpwbG90X2x5KGVkdWNhdGlvbiAlPiUgZ3JvdXBfYnkoWWVhciwgTWVhc3VyZSwgQ291bnR5KSAlPiUNCiAgc3VtbWFyaXNlKE51bWVyYXRvciA9IHN1bShOdW1lcmF0b3JfdmFsdWUpLA0KICAgICAgICAgICAgRGVub21pbmF0b3IgPSBtZWFuKFRvdGFsKSkgJT4lIGZpbHRlcihZZWFyID09IDIwMTgsIE1lYXN1cmUgPT0gJ0hpZ2ggU2Nob29sIERpcGxvbWEnKSwgeT1+Q291bnR5LCBjb2xvcj1+Q291bnR5LCBjb2xvcnM9Y291bnR5X2NvbG9yLCB4PX4oTnVtZXJhdG9yL0Rlbm9taW5hdG9yKSwgdHlwZT0nYmFyJykNCmBgYA0KDQojIEhlYWx0aA0KIyMgSGVhbHRoIENhcmUgQ292ZXJhZ2UNCmBgYHtyLCB3YXJuaW5nPUZBTFNFfQ0KcGxvdF9seShjb3ZlcmFnZSAlPiUNCiAgICAgICAgIGdyb3VwX2J5KFllYXIsIENvdW50eSwgTWVhc3VyZSkgJT4lDQogICAgICAgICBzdW1tYXJpc2UoYWRkZWQ9c3VtKE51bWVyYXRvcl92YWx1ZSkpICU+JQ0KICAgICAgICAgZmlsdGVyKFllYXI9PTIwMTYsICEoTWVhc3VyZSAlaW4lIGMoIkhlYWx0aCBJbnN1cmFuY2UgVG90YWwiKSkpLA0KICAgICAgICB5PX5Db3VudHksIHg9fmFkZGVkLCB0eXBlPSdiYXInLA0KICAgICAgICBjb2xvcj1+TWVhc3VyZSkNCg0KcGxvdF9seShjb3ZlcmFnZSAlPiUNCiAgICAgICAgIGdyb3VwX2J5KFllYXIsIENvdW50eSwgTWVhc3VyZSkgJT4lDQogICAgICAgICBzdW1tYXJpc2UoYWRkZWQ9c3VtKE51bWVyYXRvcl92YWx1ZSkpICU+JQ0KICAgICAgICAgZmlsdGVyKFllYXI9PTIwMTYsIE1lYXN1cmU9PSdDaGlsZHJlbiB3aXRob3V0IEhlYWx0aCBJbnN1cmFuY2UnKSwNCiAgICAgICB5PX5Db3VudHksIHg9fmFkZGVkLCB0eXBlPSdiYXInLCBjb2xvcj1+Q291bnR5LCBjb2xvcnM9Y291bnR5X2NvbG9yKQ0KYGBgDQojIyBEcnVnLVJlbGF0ZWQgRGVhdGhzDQpgYGB7cn0NCnBsb3RfbHkoZHJ1ZyAlPiUgZmlsdGVyKFllYXI9PTIwMTcpLCB4PX5EZWF0aHMsIHk9fkNvdW50eSwgdHlwZT0nYmFyJywgY29sb3JzPX5jb3VudHlfY29sb3IsIGNvbG9yPX5Db3VudHkpDQpgYGANCg0KIyBIb3VzaW5nDQojIyBIb3VzaW5nIEFnZQ0KYGBge3J9DQojIGF4aXMgaXMgZ2l2aW5nIGRvdWJsZSB0aGUgdHJ1ZSB2YWx1ZSBBTkQgbGluZXMgYXJlIHRoaW4NCnBsb3RfbHkoaG91c2luZyAlPiUgZmlsdGVyKFllYXIgPT0gMjAxNCksDQogICAgICAgIHk9fkNvdW50eSwgeD1+ZGlmZiwgY29sb3I9fkNvdW50eSwNCiAgICAgICAgY29sb3JzPWNvdW50eV9jb2xvciwgdHlwZT0nYmFyJykNCmBgYA0KIyBTb2NpYWwgV2VsbC1CZWluZw0KIyMgUG92ZXJ0eQ0KYGBge3J9DQpwbG90X2x5KHBvdmVydHkgJT4lIGZpbHRlcihZZWFyPT0yMDE0KSwNCiAgICAgICAgeT1+Q291bnR5LCB4PX5OdW1lcmF0b3JfdmFsdWUvRGVub21pbmF0b3JfdmFsdWUsDQogICAgICAgIGNvbG9yPX5Db3VudHksIGNvbG9ycz1jb3VudHlfY29sb3IsIHR5cGU9J2JhcicpICU+JQ0KICAgICAgbGF5b3V0KHhheGlzPWxpc3QocmFuZ2U9bGlzdCgwLDAuMikpKQ0KYGBgDQojIFRyYW5zcG9ydGF0aW9uDQojI0NvbW11dGluZyBNb2Rlcw0KYGBge3IsIGV2YWw9RkFMU0V9DQojIFdheSB0b28gbWFueSBtaXNzaW5nIHZhbHVlcyB0byBjcmVhdGUgYSBzdWJzdGFudGl2ZSB2aXN1YWxpemF0aW9uLg0KdHJhbnNwb3J0YXRpb24gJT4lIGZpbHRlcihZZWFyID09IDIwMTQpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBDb3VudHksIHkgPSBOdW1lcmF0b3JfdmFsdWUsIGZpbGwgPSBNZWFzdXJlLCBwb3NpdGlvbiA9IE1lYXN1cmUpKSArDQogIGdlb21fY29sKHBvc2l0aW9uID0gJ2RvZGdlJykgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWEpICsNCiAgY29vcmRfZmxpcCgpDQpwbG90X2x5KHRyYW5zcG9ydGF0aW9uICU+JSBmaWx0ZXIoWWVhcj09MjAxOCksDQogICAgICAgIHg9fk51bWVyYXRvcl92YWx1ZSwgeT1+Q291bnR5LCBjb2xvcj1+TWVhc3VyZSwNCiAgICAgICAgdHlwZT0nYmFyJykNCmBgYA0KDQoNCg0KDQo=
Social Well-Being
Poverty